package com.aspire.aimini.model.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * 导出任务实体
 *
 * @author wangguiyou
 * @date 2024-12-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("export_task")
public class ExportTask implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 任务ID
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 数据类型（material、copywriting、tag、statistics、user_data）
     */
    @TableField("data_type")
    private String dataType;

    /**
     * 导出格式（json、csv、excel、pdf）
     */
    @TableField("format")
    private String format;

    /**
     * 任务状态（pending、processing、completed、failed、cancelled）
     */
    @TableField("status")
    private String status;

    /**
     * 任务进度（0-100）
     */
    @TableField("progress")
    private Integer progress;

    /**
     * 过滤条件（JSON格式）
     */
    @TableField("filters")
    private String filters;

    /**
     * 导出选项（JSON格式）
     */
    @TableField("options")
    private String options;

    /**
     * 文件路径
     */
    @TableField("file_path")
    private String filePath;

    /**
     * 文件大小（字节）
     */
    @TableField("file_size")
    private Long fileSize;

    /**
     * 下载URL
     */
    @TableField("download_url")
    private String downloadUrl;

    /**
     * 错误信息
     */
    @TableField("error_message")
    private String errorMessage;

    /**
     * 开始时间
     */
    @TableField("start_time")
    private LocalDateTime startTime;

    /**
     * 完成时间
     */
    @TableField("end_time")
    private LocalDateTime endTime;

    /**
     * 过期时间
     */
    @TableField("expire_time")
    private LocalDateTime expireTime;

    /**
     * 优先级（1-10，数字越大优先级越高）
     */
    @TableField("priority")
    private Integer priority;

    /**
     * 重试次数
     */
    @TableField("retry_count")
    private Integer retryCount;

    /**
     * 最大重试次数
     */
    @TableField("max_retry_count")
    private Integer maxRetryCount;

    /**
     * 处理的记录数量
     */
    @TableField("processed_count")
    private Long processedCount;

    /**
     * 总记录数量
     */
    @TableField("total_count")
    private Long totalCount;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 是否删除（0：未删除，1：已删除）
     */
    @TableField("is_deleted")
    @TableLogic
    private Integer isDeleted;

    /**
     * 获取过滤条件Map
     */
    public Map<String, Object> getFiltersMap() {
        // 这里应该将JSON字符串转换为Map，简化处理
        return Map.of();
    }

    /**
     * 获取选项Map
     */
    public Map<String, Object> getOptionsMap() {
        // 这里应该将JSON字符串转换为Map，简化处理
        return Map.of();
    }

    /**
     * 检查任务是否已完成
     */
    public boolean isCompleted() {
        return "completed".equals(status);
    }

    /**
     * 检查任务是否失败
     */
    public boolean isFailed() {
        return "failed".equals(status);
    }

    /**
     * 检查任务是否被取消
     */
    public boolean isCancelled() {
        return "cancelled".equals(status);
    }

    /**
     * 检查任务是否正在处理
     */
    public boolean isProcessing() {
        return "processing".equals(status);
    }

    /**
     * 检查任务是否等待中
     */
    public boolean isPending() {
        return "pending".equals(status);
    }

    /**
     * 检查任务是否可以重试
     */
    public boolean canRetry() {
        return isFailed() && (retryCount == null || retryCount < maxRetryCount);
    }

    /**
     * 检查文件是否已过期
     */
    public boolean isExpired() {
        return expireTime != null && LocalDateTime.now().isAfter(expireTime);
    }

    /**
     * 获取任务持续时间（毫秒）
     */
    public Long getDurationMillis() {
        if (startTime == null) {
            return null;
        }
        LocalDateTime end = endTime != null ? endTime : LocalDateTime.now();
        return java.time.Duration.between(startTime, end).toMillis();
    }

    /**
     * 获取可读的文件大小
     */
    public String getReadableFileSize() {
        if (fileSize == null || fileSize < 0) {
            return "0 B";
        }

        String[] units = { "B", "KB", "MB", "GB", "TB" };
        int unitIndex = 0;
        double size = fileSize.doubleValue();

        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }

        return String.format("%.2f %s", size, units[unitIndex]);
    }
}